package cn.tedu.tmall.admin.content.service.impl;

import cn.tedu.tmall.admin.content.dao.persist.respository.IArticleRepository;
import cn.tedu.tmall.admin.content.dao.persist.respository.ICategoryRepository;
import cn.tedu.tmall.admin.content.pojo.param.ArticleAddParam;
import cn.tedu.tmall.admin.content.pojo.param.CategoryAddParam;
import cn.tedu.tmall.admin.content.pojo.po.ArticleDetailPO;
import cn.tedu.tmall.admin.content.pojo.po.ArticlePO;
import cn.tedu.tmall.admin.content.pojo.po.CategoryPO;
import cn.tedu.tmall.admin.content.service.IArticleService;
import cn.tedu.tmall.common.enumerator.ServiceCode;
import cn.tedu.tmall.common.ex.ServiceException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Slf4j
@Service
public class ArticleServiceImpl implements IArticleService {

    @Autowired
    private ICategoryRepository categoryRepository;

    @Autowired
    private IArticleRepository  articleRepository;

    @Override
    public void addArticle(ArticleAddParam articleAddParam) {
        //梳理增加文章的业务逻辑
        //思考题
        // 1 ArticleAddParam 里面都需要什么参数?
        // 2 addArticle里面的具体业务逻辑应该是什么样子的?
        // ArticleRepository.sava(); 能不能是否需要一些业务验证\

        // 1 文章标题能重复么? 不一定 先不做
        // 2 类别判断 ,类别必须存在 如果不存在 报错 发布文章失败,类别不存在.
        // 3 类别被禁用了,我们能在当前类别下发布文章么? 不一定
        //    先加上这个逻辑,如果被禁用 报错 发布文章失败,类别已经被禁用.
        // 4 保存文章到数据库
        //    我们想知道保存是否成功 ,如果成功了,返回,如果失败了,报错.
        Long categoryId = articleAddParam.getCategoryId();
        CategoryPO categoryPO = categoryRepository.getCategoryById(categoryId);
        //判断类别是否存在
        if (categoryPO == null) {
            String message = "发布文章失败,类别不存在!";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERROR_BAD_REQUEST,message);
        }

        if (categoryPO.getEnable() != 1) {
            String message = "发布文章失败,类别已经被禁用!";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERROR_CONFLICT,message);
        }
        //创建文章的时候没有文章没有注解id
        ArticlePO articlePO = new ArticlePO();
        BeanUtils.copyProperties(articleAddParam,articlePO);
        int rows = articleRepository.save(articlePO);
        if (rows != 1) {
            if (rows != 1) {
                String message = "发布文章失败,服务器忙!";
                log.warn(message);
                throw new ServiceException(ServiceCode.ERROR_UNKNOWN,message);
            }
        }
        Long id = articlePO.getId();
        ArticleDetailPO articleDetailPO = new ArticleDetailPO();
        //文章详情关联文章id
        articleDetailPO.setArticleId(id);
        articleDetailPO.setDetail(articleAddParam.getDetail());
        articleRepository.saveArticleDetail(articleDetailPO);
        if (rows != 1) {
            String message = "发布文章失败,服务器忙!";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERROR_UNKNOWN,message);
        }

    }

}
